/*
 * Estadistico.cpp
 *
 *  Created on: 23/06/2010
 *      Author: ignacio
 */

#include "Estadistico.h"
#include "EstadisticoNull.h"
#include <stdio.h>


Estadistico* Estadistico::instancia = NULL;
unsigned int Estadistico::ordenMaximoPPMC = 0;

Estadistico::Estadistico(int ordenMaximoPPMC)
{
	/*
	 * Cantidad de accesos por contexto.
	 * La posicion del array se corresponde con el orden del contexto
	 */
	this -> cantidadAccesos = new typeFrecuencias [ordenMaximoPPMC + 1];

	/*
	 * Cantidad de aciertos por contexto.
	 * La posicion del array se corresponde con el orden del contexto
	 */

	this -> cantidadAciertos = new typeFrecuencias [ordenMaximoPPMC + 1];

	for (int i=0; i<=ordenMaximoPPMC; i++){

		this->cantidadAccesos[i]=0;

		this->cantidadAciertos[i]=0;
	}

	this->cantidadCaracteres=0;
}

Estadistico* Estadistico::getInstancia(bool activo)
{
	if (instancia == NULL || activo)
	{
		delete instancia;

		if (activo){

			instancia = new Estadistico(ordenMaximoPPMC);
		}
		else{
			instancia = new EstadisticoNull();
		}
	}
	return instancia;
}

void Estadistico::borrarInstancia()
{
	delete instancia;
	instancia = NULL;
}

void Estadistico::sumarCaracteres(){

	this->cantidadCaracteres++;
}

Estadistico::~Estadistico(){

	if (this->cantidadAccesos!=NULL){
		delete[] this->cantidadAccesos;
	}

	if (this->cantidadAciertos!=NULL){

		delete[] this->cantidadAciertos;

	}

}

//void Estadistico::calcularAciertosPorContexto()
//{
//
//	int ordenContexto;
//	typeFrecuencias cantidadAciertos, cantidadAccesos, frecuenciaESC;
//
//	Contexto* contexto = this -> ppmc -> primerContexto();
//
//	while (contexto != NULL)
//	{
//		ordenContexto = contexto -> getOrden();
//
//		frecuenciaESC = contexto -> getDistribucion(Distribucion::CARACTER_ESCAPE) -> getFrecuencia();
//		cantidadAccesos = contexto -> getTotalFrecuencias() - frecuenciaESC;
//		cantidadAciertos = cantidadAccesos - frecuenciaESC;
//
//		this -> cantidadAccesos[ordenContexto] += cantidadAccesos;
//		this -> cantidadAciertos[ordenContexto] += cantidadAciertos;
//
//		this -> ppmc -> getSiguienteContexto();
//	}
//}

void Estadistico::setOrdenMaximoPPMC(int ordenMaximo)
{
	ordenMaximoPPMC = ordenMaximo;
}

void Estadistico::sumarAcceso(int orden)
{
	this -> cantidadAccesos[orden] += 1;
}

void Estadistico::sumarAcierto(int orden)
{
	this -> cantidadAciertos [orden] += 1;
}

void Estadistico::printAciertosPorContexto()
{

	for (unsigned int i = 0; i < ordenMaximoPPMC + 1; i++)
	{
		std::cout << "Contexto orden " << i << std::endl;
		std::cout << "# Accesos = " << this -> cantidadAccesos[i] << std::endl;
		std::cout << "# Aciertos = " << this -> cantidadAciertos[i] << std::endl;
		std::cout << std::endl;
	}

	typeFrecuencias bitEmitidos = Compresor::getTamanioArchivo();

	std::cout << "Tamaño Archivo Origen(bytes): \""<< this->cantidadCaracteres-1 << "\" Bit Emitidos luego de descomprimir: \""<< bitEmitidos <<"\" ( bytes: \"" << bitEmitidos/8 <<"\" )"<<'\n';
}
